﻿/*
 * Created by SharpDevelop.
 * User: LBALERI
 * Date: 06/02/2013
 * Time: 09:36 a.m.
 * 
 * To change this template use Tools | Options | Coding | Edit Standard Headers.
 */
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using AForge.Video;
using AForge.Video.DirectShow;
using System.IO;
using System.Drawing.Imaging;


namespace CapturaImagen
{
	/// <summary>
	/// Description of Camara.
	/// </summary>
	public partial class Camara : Form
	{
		static bool fotografiaHecha = false;
		static FilterInfoCollection camara;
		static VideoCaptureDevice captura = null;
		static EscribirLog texto = new EscribirLog();
		public static String nombreMuestra = null;
        public static String carpeta;
		
		public Camara()
		{
			//
			// The InitializeComponent() call is required for Windows Forms designer support.
			//
			InitializeComponent();
			Load += new EventHandler(Camara_Load);
			//
			// TODO: Add constructor code after the InitializeComponent() call.
			//
		}
		
		void BtnSalirClick(object sender, EventArgs e)
		{
			if (captura != null) {
				if(captura.IsRunning) {
					captura.SignalToStop();
					captura = null;
				}
			}
			Dispose();
			Close();
			
		}
		
		
		void BtnCapturaClick(object sender, EventArgs e)
		{
			CapturarImagen();
			fotografiaHecha = true;
		}
		
		private void Camara_Load(object sender, EventArgs e)
		{
			this.txtNombre.Text = nombreMuestra;
			camara = new FilterInfoCollection(FilterCategory.VideoInputDevice);
			if (camara.Count == 0) {
				MessageBox.Show("No hay dispositivos disponibles!!","Alerta",MessageBoxButtons.OK,MessageBoxIcon.Exclamation);
				this.Close();
			} else {
				
				captura = new VideoCaptureDevice(camara[0].MonikerString);
				captura.NewFrame += new NewFrameEventHandler(MostrarImagen);
				captura.Start();
			}
		}
		
		
		void BtnGuardaClick(object sender, EventArgs e)
		{
			if (fotografiaHecha)
			{
				// Recorto la imagen conforme lo mostrado (Size del pctbox_webcam)
				//Rectangle formaRecorte = new Rectangle(0, 0, 300, 600);
				Bitmap imagenOrigen = (Bitmap)pctTomada.Image;
				//Bitmap imagen = imagenOrigen.Clone(formaRecorte, imagenOrigen.c);
				if (txtNombre.Text.Trim().Equals("")) {
					MessageBox.Show("Ingrese Nombre de la Muestra!!", "Alerta",
					                MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
				}else {

					// Y la guardo
					try
					{
						String ruta = Herramientas.comprobarDirectorioImagenes(carpeta);
						nombreMuestra = txtNombre.Text.Trim();
						int id_muestra = DAOAtributos.buscarMuestraPorNumero(nombreMuestra);
						String rutaMuestra = DAOAtributos.obtenerRutaImagen(nombreMuestra);
						ruta += nombreMuestra;
						ruta += ".JPG";
                        ImageCodecInfo jgpEncoder = GetEncoder(ImageFormat.Jpeg);

                        // Create an Encoder object based on the GUID
                        // for the Quality parameter category.
                        System.Drawing.Imaging.Encoder myEncoder =
                            System.Drawing.Imaging.Encoder.Quality;

                        // Create an EncoderParameters object.
                        // An EncoderParameters object has an array of EncoderParameter
                        // objects. In this case, there is only one
                        // EncoderParameter object in the array.
                        EncoderParameters myEncoderParameters = new EncoderParameters(1);

                        EncoderParameter myEncoderParameter = new EncoderParameter(myEncoder, 50L);
                        myEncoderParameters.Param[0] = myEncoderParameter;
                        imagenOrigen.Save(ruta, jgpEncoder, myEncoderParameters);
						//imagenOrigen.Save(ruta);
						
						//guardar ruta en base de datos
						if (null == rutaMuestra) {
							DAOAtributos.insertarImagen(ruta,id_muestra);
						}else{
							DAOAtributos.modificarImagen(ruta,id_muestra);
						}
						

						MessageBox.Show("Fotografía almacenada", "Exito",
						                MessageBoxButtons.OK, MessageBoxIcon.Information);
					}
					catch (Exception ex)
					{
                        EscribirLog.escribirArchivo(ex.Message);
						MessageBox.Show("No se pudo almacenar la imagen!!", "Error",
						                MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
					}
				}
			}
			else
			{
				MessageBox.Show("Para guardar la fotografía, use en primer lugar el botón de Captura", "Alerta",
				                MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
			}
			
		}
		private void MostrarImagen(object sender, NewFrameEventArgs eventArgs)
		{
			Bitmap imagen = (Bitmap)eventArgs.Frame.Clone();
			pctImagen.Image = imagen;
		}
		private void CapturarImagen(){
			if(captura != null){
				if (captura.IsRunning ) {
					pctTomada.Image = pctImagen.Image;
					
				}
			}
		}

        private void Camara_FormClosed(object sender, FormClosedEventArgs e)
        {
            if (captura != null)
            {
                if (captura.IsRunning)
                {
                    captura.SignalToStop();
                    captura = null;
                }
            }
            Dispose();
            Close();
        }

        private void btnSalir_MouseHover(object sender, EventArgs e)
        {
            ToolTip ver = new ToolTip();
            ver.SetToolTip(btnSalir, "Salir");
        }

        private void btnCaptura_MouseHover(object sender, EventArgs e)
        {
            ToolTip ver = new ToolTip();
            ver.SetToolTip(btnCaptura, "Capturar");
        }

        private void btnGuarda_MouseHover(object sender, EventArgs e)
        {
            ToolTip ver = new ToolTip();
            ver.SetToolTip(btnGuarda, "Guardar");
        }

        private ImageCodecInfo GetEncoder(ImageFormat format)
        {

            ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders();

            foreach (ImageCodecInfo codec in codecs)
            {
                if (codec.FormatID == format.Guid)
                {
                    return codec;
                }
            }
            return null;
        }
    
        }
	}
